#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

#define ERREUR(msg)		printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg);printf("\n");
#define ERREUR2(msg,params)	printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg,params);printf("\n");

int getNumeroArete( int min, int max, int nbSommets ){
	
	int i, decalage = 0;
	for(i=1; i<min; i++)
		decalage += nbSommets-i;
		
	return (max-min + decalage);
}

int main( int argc, char *argv[] ){

	int fichier=0, i, sommets, nbAretes, j, k;

	/* Si il y a un argument -h ou plus d'un */
	if( argc<2 || !strcmp(argv[1],"-h") ){

		printf("\nUsage:\n");
		printf("\t%s <Nombre de sommet> [fichier de formules de cardinalite]\n", argv[0]);
		printf("Si aucun fichier est specifie on ecrit les formules dans la sortie standard\n");

		return 0;

	/* Si un fichier est specifie */
	}else if(argc>=3){

		/* on remplace l'entree standard par le fichier */
		if( (fichier = open(argv[2], O_WRONLY| O_CREAT, S_IRUSR|S_IWUSR )) == -1 ){

			ERREUR2("Ne peut creer le fichier \"%s\"", argv[3]);
			return 0;

		}

		if( dup2( fichier, fileno(stdout) ) == -1 ){

			ERREUR2("Ne peut rediriger le flux de \"%s\"", argv[3]);
			return 0;

		}
	
	}
	
	// tailles
	sommets = atoi(argv[1]);
	nbAretes = ((sommets-1)*sommets)/2;
	
	// generation
	printf("%i %i\n", (sommets*(sommets-1)*(sommets-2))/2,  nbAretes*3);

	/*** Au moins une couleur par arc ***/
	j = 0;
	for( i=1; i<=nbAretes; i++ ){

		printf("( 1, { %i, %i, %i } )\n", i+2*j, i+1+2*j, i+2+2*j);
		j++;
	}

	/*** Au plus une couleur par arc ***/
	j = 0;
	for( i=1; i<=nbAretes; i++ ){

		printf("( 2, { -%i, -%i, -%i } )\n", i+2*j, i+1+2*j, i+2+2*j);
		j++;
	}

	int a1, a2, a3;
	
	/*** Pas de triangle de la meme couleur **/
	for( i=1; i<sommets-1; i++){
		for( j=i+1; j<sommets; j++)
			for( k=j+1; k<=sommets; k++){
				a1 = getNumeroArete(i,j,sommets);
				a2 = getNumeroArete(j,k,sommets);
				a3 = getNumeroArete(i,k,sommets);
				printf("( 1, { -%i, -%i, -%i } )\n", a1+(a1-1)*2, a2+(a2-1)*2, a3+(a3-1)*2);
				printf("( 1, { -%i, -%i, -%i } )\n", a1+2+(a1-1)*2, a2+2+(a2-1)*2, a3+2+(a3-1)*2);
				printf("( 1, { -%i, -%i, -%i } )\n", a1+1+(a1-1)*2, a2+1+(a2-1)*2, a3+1+(a3-1)*2);
			}
	}
	// deverouillage du fichier
	close( fichier );
	
	return 0;
}

